<?php
	
	/**
	Validate an email address.
	Provide email address (raw input)
	Returns true if the email address has the email 
	address format and the domain exists.
	http://www.linuxjournal.com/article/9585
	*/
	//Comenté la parte que verifica que el dominio exista
	function validEmail($email, $msgError="Favor ingresar un e-mail valido.")
	{
	   $isValid = true;
	   $atIndex = strrpos($email, "@");
	   if (is_bool($atIndex) && !$atIndex)
	   {
	      $isValid = false;
	   }
	   else
	   {
	      $domain = substr($email, $atIndex+1);
	      $local = substr($email, 0, $atIndex);
	      $localLen = strlen($local);
	      $domainLen = strlen($domain);
	      if ($localLen < 1 || $localLen > 64)
	      {
	         // local part length exceeded
	         $isValid = false;
	      }
	      else if ($domainLen < 1 || $domainLen > 255)
	      {
	         // domain part length exceeded
	         $isValid = false;
	      }
	      else if ($local[0] == '.' || $local[$localLen-1] == '.')
	      {
	         // local part starts or ends with '.'
	         $isValid = false;
	      }
	      else if (preg_match('/\\.\\./', $local))
	      {
	         // local part has two consecutive dots
	         $isValid = false;
	      }
	      else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain))
	      {
	         // character not valid in domain part
	         $isValid = false;
	      }
	      else if (preg_match('/\\.\\./', $domain))
	      {
	         // domain part has two consecutive dots
	         $isValid = false;
	      }
	      else if
	(!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/',
	                 str_replace("\\\\","",$local)))
	      {
	         // character not valid in local part unless 
	         // local part is quoted
	         if (!preg_match('/^"(\\\\"|[^"])+"$/',
	             str_replace("\\\\","",$local)))
	         {
	            $isValid = false;
	         }
	      }
	    /*  if ($isValid && !(checkdnsrr($domain,"MX") || checkdnsrr($domain,"A")))
	      {
	         // domain not found in DNS
	         $isValid = false;
	      }*/
	   }
	   if (!$isValid){
	   	return $msgError;
	   }
	   else {
	   	return true;
	   }
	}


	
	//Función para enviar correos html con la clase phpmailer v. 5, SIN usar smtp.
	//$to puede ser un array q contenga varios destinatarios, o una cadena con una sola dir. de correo
	function correoHtMail($to, $from, $fromName, $subject, $msgHTML){
			
		require_once 'phpmailer/class.phpmailer.php';
		try {
			$mail = new PHPMailer(true);
			
			if (is_array($to)){
				foreach ($to as $destino){
					$mail->AddAddress ($destino);
				}
			}
			else { //si es una cadena (mimail@srv.com)
				$mail->AddAddress ($to);
			}
			
			$mail->IsMail();  // telling the class to use SMTP					
			$mail->IsHTML(true);
			$mail->CharSet = 'UTF-8';			
			$mail->From =  $from;
			$mail->FromName = $fromName;
			$mail->Subject = $subject;
			$mail->Body = $msgHTML;			
			$mail->Send();
			return true;
		}
		catch (phpmailerException $e){			
			return false;
		} 
	}
	
	//Función para enviar correos html con la clase phpmailer v. 5, usando smtp.
	//$to puede ser un array q contenga varios destinatarios, o una cadena con una sola dir. de correo
	function correoHtSmtp($to, $replyTo, $fromName, $subject, $msgHTML, $smtpUsr, $smtpPass, $host='localhost', $port=''){
		
		require_once 'phpmailer/class.phpmailer.php';
		try {
			$mail = new PHPMailer(true);
			
			if (is_array($to)){
				foreach ($to as $destino){
					$mail->AddAddress ($destino);
				}
			}
			else { //si es una cadena (mimail@srv.com)
				$mail->AddAddress ($to);
			}
			
			$mail->AddReplyTo($replyTo, $fromName);
			$mail->IsSMTP();  // telling the class to use SMTP
			$mail->SMTPAuth = true; // turn on SMTP authentication		
			$mail->IsHTML(true);
			$mail->CharSet = 'UTF-8';
			$mail->Username = $smtpUsr;
			$mail->Password = $smtpPass;
			$mail->Host = $host;
			$mail->Port = $port;
			$mail->From =  $smtpUsr;
			$mail->FromName = $fromName;
			$mail->Subject = $subject;
			$mail->Body = $msgHTML;			
			$mail->Send();
			return true;
		}
		catch (phpmailerException $e){			
			return false;
		} 
	}
	
	
	
	//esta función devuelve true sólo si todos los campos q se indiquen, se encuentran en
	//el arreglo $_POST
	function camposObligatorios ($campos, $msgError="Todos los campos son obligatorios"){		
		foreach ($campos as $campo){
			if ($_POST[$campo]=="") return $msgError;			
		}
		return true;
	}
	
	//Esta función llama a las funciones de validación q se le indiquen, estas deben
	//enviarse de manera similar a:
	/*
	 * array(
	 * 		array(
	 * 			  'nombreFunción1'=>array(
	 * 									   'argumentosFuncion1'
	 * 									  )
	 * 			  ), 
	 * 		array(
	 * 			  'nombreFunción2'=>'array(
	 * 										'argumentosFuncion2'
	 * 									   )
	 * 			 ) 
	 */
	function validar($reglas){		
		foreach ($reglas as $regla=>$args){			
			$params=arr2csv($args);
			$funcion="\$res=".$regla."($params);";
			eval ($funcion);
			if($res!==true) return $res;
		}
		return true;
	}
	
	
	//Recibe un array y devuelve una cadena con sus elementos
	//separados por comas, p.ej. si se le envia:
	//array(array('heucalipto','roble'),'banano');
	//devolverá: "array('heucalipto', 'roble'), 'banano'"
	//(Es similar a implode() pero sirve con arrays) 
	function arr2csv($arreglo){
		$cadArgs = '';
		foreach ($arreglo as $valor){			
			if (is_array($valor)){
				$cadArgs .= 'array('.arr2csv($valor).'), ';						
			}
			else {
				$cadArgs .= "'" .$valor ."', ";
			}
		}
		if($cadArgs!=''){
			$cadArgs=substr($cadArgs,0,-2);
		}
		return $cadArgs;
	}
	
	//Valida que los elementos del array muestras que se le envien sean numéricos,  
	//$excepciones es un array de cadenas que sí pueden estar en los elementos
	//a validar.	//Los parámetros a validar deben ir después de $excepciones.
	function validaNumerico($muestra, $excepciones=null,$msgError="Por favor ingresar solo numeros en el campo Telefono."){
		if(is_array($muestra)){
			foreach($muestra as $campo){
				if (!validaNumerico($campo)) return $msgError;
			}
			return true;
		}
		else { //ya tenemos una cadena a validar
			if (is_array($excepciones)){
				foreach($excepciones as $excepcion){
					$muestra=str_replace($excepcion,'', $muestra); //quitamos las excepciones de la cadena
				}
			}
			else {
				$muestra=str_replace($excepciones,'', $muestra); //quitamos las excepciones de la cadena
			}
						
			if (is_numeric($muestra)){
				return true;
			}
			else {
				return $msgError;
			}
		}		
	}
	
			
?>